/**
 * 定义 store 中的一个模块，专门用于处理购物车数据
 * 购物车数组中保存每件选购商品的对象信息: {id, title, image, price, amount, checked}
 */
const carModules = {
    //开启命名空间
    namespaced: true,
    //保存状态数据
    state: {
        cart: [], //保存所有购物车中的商品数据
    },
    // 计算值
    getters: {
        //购物车数组
        cart(state){
            return state.cart
        },
        //勾选商品的总金额
        totalPrice(state){
            return state.cart.reduce((sum ,curr) => curr.checked ? ( sum + curr.price * curr.amount) : sum, 0) *100
        },
        //购物车中商品总数量
        totalAmount(state){
            const count = state.cart.reduce((sum, curr) => sum + curr.amount ,0)
            return count > 99 ? '99+' :count
        },
        //是否全选
        isAllChecked(state){
            return state.cart.every(goods => goods.checked)
        },
        // 是否半选（部分选中）
        isHalfChecked(state){
            //计算选中商品的数量
            const count = state.cart.reduce((res, curr) => curr.checked ? res + 1 : res, 0)
            /*
            const count = state.cart.reduce((res, curr) => {
                if (curr.checked) {
                return res + 1
                }
                return res
            }, 0)
            */
            return count > 0 && count < state.cart.length
        },

    },
    //同步更新状态数据的方法
    mutations: {

        /**
         * 初始化购物车数组数据
         */
        init(state, payload) {
            state.cart = payload
        },
        /**
         * 选购商品加入购物车处理
         * 需要判断，如果购物车中已有当前选购的商品信息，则直接叠加其数量
         * 即可，如果购物车中不存在当前选购商品才将商品对象添加到购物车数组中保存
         * @param payload 当前选购商品对象
         */
        addToCart(state,payload) {
            //查询原购物车中是否存在当前选购的商品
            const goods = state.cart.find(prod => prod.id === payload.id)
            //判断
            if (goods) {  // 有商品已存在，则叠加数量即可
                goods.amount += payload.amount ?? 1
            } else {  // 没有商品，则添加到数组中保存
                state.cart.push({
                    ...payload,
                    amount: payload.amount ?? 1, //选购商品的数量，默认为1
                    checked : false,  //选中状态，默认为未选中
                })
            }
        },
        /**
         * 从购物车中移除商品
         */
        removeFromCart(state, id){
            console.log('删除了商品');
            state.cart = state.cart.filter(goods => goods.id !== id)
        },
        /**
         * 修改购物车中指定商品的选购数量
         * @param payload 有效载荷，传递一个对象 {id, amount}
         */
        modifyAmount(state, payload){
            state.cart = state.cart.map(goods => {
                if(goods.id === payload.id) {
                    goods.amount = payload.amount
                }
                return goods
            })
        },
        /**
         * 切换商品选中状态
         */
        toggle(state,id){
            state.cart = state.cart.map(goods => {
                if(goods.id === id){
                    goods.checked = !goods.checked
                }
                return goods
            })
        },
        /**
         * 全选或取消全选
         * @param {*} state 
         */
        checkAll(state, checked){
            state.cart = state.cart.map(goods => {
                goods.checked = checked
                return goods
            })
        }

    },
    //异步更新状态数据的方法
    actions: {

    }
}
export default carModules